<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // bind() 方法创建一个新的函数，在 bind() 被调用时，这个新函数的 this 被指定为 bind() 的第一个参数，而其余参数将作为新函数的参数，供调用时使用。
        // 语法: function.bind(thisArg, arg1, arg2, ...)

        // bind()除了this还接收其他参数，bind()返回的函数也接收参数，这两部分的参数都要传给返回的函数
        // new会改变this指向：如果bind绑定后的函数被new了，那么this指向会发生改变，指向当前函数的实例
        // 没有保留原函数在原型链上的属性和方法

        Function.prototype.myBind = function (thisArg, ...args) {
            const self = this
            const fBond = function () {
                self.apply(this instanceof self ? this : thisArg, args.concat(arguments)) // 如果 this 出现在 Function 的原型链上，也就意味着这里是被当做为构造函数进行调用的。
            }
            fBond.prototype = new Object(self.prototype) //继承原型上的属性和方法
            return fBond
        }

        const obj = {
            name: '舒文俊'
        }

        function say() {
            alert(this.name)
        }

        const sayBindObj = say.myBind(obj)
        sayBindObj()
    </script>
</body>

</html>